home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / +look_here_1st!+ / reader_requests / alienbreed3d2 / new3dtexture.s < prev    next >
Text File  |  1997-11-28  |  20KB  |  1,290 lines

  1.  
  2. * the 'Hello World' program in 68000 Assembler
  3. * the C version can be found in the Intuition manual
  4.  
  5. * this source code (C) HiSoft 1992 All Rights Reserved
  6.  
  7. * for Devpac Amiga Version 2 the following symbols were changed
  8. * to avoid clashes with the new include files:
  9. * Screen->MyScreen, NewScreen->MyNewScreen
  10. * Window->MyWindow, NewWindow->MyNewWindow
  11.  
  12.     opt    c+,d+
  13.  
  14.     include    workbench:utilities/devpac/system            use pre-assembled header
  15.     include    exec/exec_lib.i
  16.     include    intuition/intuition.i
  17.     include    intuition/intuition_lib.i
  18.     include    graphics/graphics_lib.i
  19.     include    graphics/text.i
  20.  
  21. INTUITION_REV    equ    31        v1.1
  22. GRAPHICS_REV    equ    31        v1.1
  23.  
  24. * Open the intuition library
  25.  
  26.     moveq    #100,d4            default error return code
  27.  
  28.     moveq    #INTUITION_REV,d0    version
  29.     lea    int_name(pc),a1
  30.     CALLEXEC OpenLibrary
  31.     tst.l    d0
  32.     beq    exit_false        if failed then quit
  33.     move.l    d0,_IntuitionBase    else save the pointer
  34.  
  35.     moveq    #GRAPHICS_REV,d0
  36.     lea    graf_name(pc),a1
  37.     CALLEXEC OpenLibrary
  38.     tst.l    d0
  39. ;    beq    exit_closeint        if failed then close Int, exit
  40.     move.l    d0,_GfxBase
  41.  
  42.     lea    MyNewScreen(pc),a0
  43.     CALLINT    OpenScreen        open a screen
  44.     tst.l    d0
  45. ;    beq    exit_closeall        if failed the close both, exit
  46.     move.l    d0,MyScreen
  47.  
  48.     move.l MyScreen,a0
  49.     lea sc_BitMap(a0),a0
  50.     lea bm_Planes(a0),a0
  51.     move.l #RAWSCRN,(a0)
  52.     move.l #RAWSCRN+10240,4(a0)
  53.     move.l #RAWSCRN+10240*2,8(a0)
  54.     move.l #RAWSCRN+10240*3,12(a0)
  55.     move.l #RAWSCRN+10240*4,16(a0)
  56.     move.l #RAWSCRN+10240*5,20(a0)
  57.     move.l #RAWSCRN+10240*6,24(a0)
  58.     move.l #RAWSCRN+10240*7,28(a0)
  59.  
  60. * now initialise a NewWindow structure. This is normally easier to
  61. * do with dc.w/dc.l statement etc, but for comparison with the C
  62. * version we do it like this
  63.     lea    MyNewWindow(pc),a0    good place to start
  64.     move.w    #20,nw_LeftEdge(a0)
  65.     move.w    #20,nw_TopEdge(a0)
  66.     move.w    #300,nw_Width(a0)
  67.     move.w    #100,nw_Height(a0)
  68.     move.b    #0,nw_DetailPen(a0)
  69.     move.b    #1,nw_BlockPen(a0)
  70.     move.l    #window_title,nw_Title(a0)
  71. _temp    set    WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING
  72.     move.l    #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
  73.     move.l    #CLOSEWINDOW,nw_IDCMPFlags(a0)
  74.     move.w    #CUSTOMSCREEN,nw_Type(a0)
  75.     clr.l    nw_FirstGadget(a0)
  76.     clr.l    nw_CheckMark(a0)
  77.     move.l    MyScreen(pc),nw_Screen(a0)
  78.     clr.l    nw_BitMap(a0)
  79.     move.w    #100,nw_MinWidth(a0)
  80.     move.w    #25,nw_MinHeight(a0)
  81.     move.w    #640,nw_MaxWidth(a0)
  82.     move.w    #200,nw_MaxHeight(a0)
  83.  
  84. * thats it set up, now open the window (a0=NewWindow already)
  85. ;    CALLINT    OpenWindow
  86. ;    tst.l    d0
  87. ;    beq    exit_closescr            if failed
  88. ;    move.l    d0,MyWindow            save it
  89. ;
  90. ;    move.l    d0,a1                window
  91. ;    move.l    wd_RPort(a1),a1            rastport
  92. ;    moveq    #20,d0                X
  93. ;    moveq    #20,d1                Y
  94. ;    CALLGRAF Move                move the cursor
  95. ;
  96. ;    move.l    MyWindow(pc),a0
  97. ;    move.l    wd_RPort(a0),a1            rastport
  98. ;    lea    hello_message(pc),a0
  99. ;    moveq    #11,d0
  100. ;    CALLGRAF Text                print something
  101. ;
  102. ;    move.l    MyWindow(pc),a0
  103. ;    move.l    wd_UserPort(a0),a0
  104. ;    move.b    MP_SIGBIT(a0),d1        (misprint in manual)
  105. ;    moveq    #0,d0
  106. ;    bset    d1,d0                do a shift
  107. ;    CALLEXEC Wait
  108.  
  109. ;    moveq    #0,d4                return code
  110.  
  111. * various exit routines that do tidying up, given a return code in d4
  112.  
  113. ;    move.l    MyWindow(pc),a0
  114. ;    CALLINT CloseWindow
  115.  
  116. ;exit_closescr
  117. ;    move.l    MyScreen(pc),a0
  118. ;    CALLINT CloseScreen
  119.  
  120. ;exit_closeall
  121. ;    move.l    _GfxBase(pc),a1
  122. ;    CALLEXEC CloseLibrary
  123.  
  124. ;exit_closeint
  125. ;    move.l    _IntuitionBase(pc),a1
  126. ;    CALLEXEC CloseLibrary
  127.  
  128. ;done:
  129. ;    bra done
  130.  
  131.  move.l #PALETTEBIT,a0
  132.  move.l #COPIEDPAL+4,a1
  133.  move.w #255,d0
  134.  
  135. copydown:
  136.  move.b 1(a0),(a1)
  137.  move.b 3(a0),4(a1)
  138.  move.b 5(a0),8(a1)
  139.  add.w #6,a0
  140.  add.w #12,a1
  141.  dbra d0,copydown
  142.  
  143.  move.w #256,COPIEDPAL
  144.  move.w #0,COPIEDPAL+2
  145. LOOKFORME:
  146.  move.l MyScreen,a0
  147.  lea sc_ViewPort(a0),a0
  148.  move.l #COPIEDPAL,a1
  149.  move.l _GfxBase,a6
  150.  jsr -$372(a6)
  151.  
  152.  move.l MyScreen,a4
  153.  move.w sc_MouseX(a4),d0
  154.  move.w sc_MouseY(a4),d1
  155.  move.w d0,OLDXM
  156.  move.w d1,OLDYM
  157.     
  158. loop:
  159.  
  160.  move.l MyScreen,a4
  161.  move.w sc_MouseX(a4),d0
  162.  move.w sc_MouseY(a4),d1
  163.  
  164.  sub.w OLDXM,d0
  165.  sub.w OLDYM,d1
  166.  add.w d0,OLDXM
  167.  add.w d1,OLDYM
  168.  
  169.  btst #6,$bfe001
  170.  beq.s .SHIFTABOUT
  171.  
  172.  
  173.  
  174.  muls #8190,d0
  175.  divs #320,d0
  176.  add.w d0,YANG
  177.  and.w #8190,YANG
  178.  muls #8190,d1
  179.  divs #320,d1
  180.  and.w #8190,d1
  181.  add.w d1,XANG
  182.  and.w #8190,XANG
  183.  bra .ROTABOUT
  184. .SHIFTABOUT
  185.  
  186.  add.w d0,XOFF
  187.  add.w d1,ZOFF
  188.  
  189.  
  190. .ROTABOUT
  191.  
  192.  move.l #POLYGONDATA,a0
  193.  move.w (a0)+,d7    ; number of polys
  194. POLYGONLOOP:
  195.  move.l d7,-(a7)
  196.  
  197.  move.w (a0)+,TEXTUREADD
  198.  
  199.  move.w XANG,d1
  200.  move.w YANG,d3
  201.  move.l #SINETABLE,a1
  202.  move.l #ROTATEDPTS,a2
  203.  move.l #UVCOORDS,a3
  204.  move.w (a1,d1.w),XSIN    ;xsin
  205.  move.w (a1,d3.w),YSIN    ;ysin
  206.  
  207.  add.w #2048,a1
  208.  move.w (a1,d1.w),XCOS    ;xcos
  209.  move.w (a1,d3.w),YCOS    ;ycos
  210.  
  211.  moveq #3,d7
  212. ROTPTLOP:
  213.  
  214.  move.w (a0)+,d0
  215.  move.w d0,d3
  216.  move.w (a0)+,d1
  217.  move.w (a0)+,d2
  218.  move.w d2,d5
  219.  
  220.  muls YCOS,d0
  221.  muls YSIN,d2
  222.  sub.l d2,d0
  223.  asr.l #6,d0    ; new x*512
  224.  
  225.  muls YSIN,d3
  226.  muls YCOS,d5
  227.  add.l d5,d3
  228.  add.l d3,d3
  229.  swap d3
  230.  move.w d3,d2    ; new z
  231.  
  232.  move.w d1,d4
  233.  move.w d2,d5
  234.  muls XCOS,d1
  235.  muls XSIN,d2
  236.  sub.l d2,d1
  237.  asr.l #6,d1    ; new y*512
  238.  
  239.  muls XSIN,d4
  240.  muls XCOS,d5
  241.  add.l d5,d4
  242.  add.l d4,d4
  243.  swap d4
  244.  move.w d4,d2    ; new z
  245.  
  246.  
  247.  add.w ZOFF,d2
  248.  ext.l d2
  249.  
  250.  move.w XOFF,d5
  251.  ext.l d5
  252.  asl.l #8,d5
  253.  add.l d5,d5
  254.  add.l d5,d0
  255.  
  256.  move.l d0,(a2)+
  257.  move.l d1,(a2)+
  258.  move.l d2,(a2)+
  259.  addq #4,a2
  260.  
  261.  move.l (a0)+,(a3)+
  262.  
  263.  dbra d7,ROTPTLOP
  264.  
  265.  move.l a0,-(a7)
  266.  
  267.  moveq #3,d7
  268.  move.l #ROTATEDPTS,a0
  269.  move.l #ONSCREENPTS,a1
  270.  move.l FASTBUFFER,a2
  271. CONVTOSCREEN:
  272.  move.l (a0)+,d0
  273.  move.l (a0)+,d1
  274.  move.l (a0)+,d2
  275.  addq #4,a0  
  276.  
  277.  divs d2,d0
  278.  divs d2,d1
  279.  add.w #160*4,d0
  280.  add.w #128*4,d1
  281.  move.w d0,(a1)+
  282.  move.w d1,(a1)+
  283.  
  284. ; ext.l d0
  285. ; ext.l d1
  286. ; asr.l #2,d0
  287. ; and.b #%11111100,d1
  288. ; asl.l #4,d1
  289. ; move.l d1,d2
  290. ; asl.l #2,d1
  291. ; add.l d2,d1
  292. ; add.l d1,d0
  293. ;
  294. ; move.b #255,(a2,d0.l)
  295.  
  296.  dbra d7,CONVTOSCREEN
  297.  
  298.  move.l #ONSCREENPTS,a1
  299.  move.w (a1),d0    ;x1
  300.  sub.w 4(a1),d0
  301.  move.w 8(a1),d2
  302.  sub.w 4(a1),d2
  303.  
  304.  
  305.  move.w 2(a1),d1    ;x1
  306.  sub.w 6(a1),d1
  307.  move.w 10(a1),d3
  308.  sub.w 6(a1),d3
  309.  
  310.  muls d2,d1
  311.  muls d0,d3
  312.  sub.l d3,d1
  313.  ble NOPOLYGON
  314.  
  315. *****************************
  316. * Calculate the light map
  317.  move.l #LIGHTMAP,a0
  318.  move.l #WORLD,a1
  319.  move.l #ROTATEDPTS,a2
  320.  move.l #0,d7
  321. ACROSS:
  322.  move.w #0,d6
  323.  move.l (0*16)(a2),d0
  324.  move.l (1*16)(a2),d3
  325.  sub.l d0,d3
  326.  move.l 4+(0*16)(a2),d1
  327.  move.l 4+(1*16)(a2),d4
  328.  sub.l d1,d4
  329.  move.l 8+(0*16)(a2),d2
  330.  move.l 8+(1*16)(a2),d5
  331.  sub.l d2,d5
  332.  muls.l d7,d3
  333.  muls.l d7,d4
  334.  muls.l d7,d5
  335.  asr.l #3,d3
  336.  asr.l #3,d4
  337.  asr.l #3,d5
  338.  add.l d3,d0    ;tx
  339.  add.l d4,d1    ;ty
  340.  add.l d5,d2    ;tz
  341.  
  342.  move.l 3*16(a2),d3
  343.  move.l 2*16(a2),d6
  344.  sub.l d3,d6
  345.  muls.l d7,d6
  346.  asr.l #3,d6
  347.  add.l d6,d3
  348.  
  349.  move.l 4+(3*16)(a2),d4
  350.  move.l 4+(2*16)(a2),d6
  351.  sub.l d4,d6
  352.  muls.l d7,d6
  353.  asr.l #3,d6
  354.  add.l d6,d4
  355.  
  356.  move.l 8+(3*16)(a2),d5
  357.  move.l 8+(2*16)(a2),d6
  358.  sub.l d5,d6
  359.  muls.l d7,d6
  360.  asr.l #3,d6
  361.  add.l d6,d5
  362.  
  363.  asr.l #8,d0
  364.  asr.l #8,d1
  365.  asr.l #8,d3
  366.  asr.l #8,d4
  367.  asr.l #1,d0
  368.  asr.l #1,d1
  369.  asr.l #1,d3
  370.  asr.l #1,d4
  371.  
  372.  sub.l d0,d3
  373.  sub.l d1,d4
  374.  sub.l d2,d5
  375.  sub.w #512,d2
  376.  
  377.  swap d3
  378.  clr.w d3
  379.  swap d4
  380.  clr.w d4
  381.  swap d2
  382.  clr.w d2
  383.  swap d0
  384.  clr.w d0
  385.  swap d1
  386.  clr.w d1
  387.  swap d5
  388.  clr.w d5
  389.  asr.l #8,d5
  390.  asr.l #5,d2
  391.  asr.l #8,d3
  392.  asr.l #5,d0
  393.  asr.l #8,d4
  394.  asr.l #5,d1
  395.  move.l d3,XADD
  396.  move.l d4,YADD
  397.  move.l d5,ZADD
  398.  add.l #20*65536,d0
  399.  add.l lmxoff,d0
  400.  
  401.  add.l #20*65536,d1
  402.  add.l #20*65536,d2
  403.  
  404.  move.w #0,d6 
  405.  
  406. DOWN:
  407.  
  408.  add.l XADD,d0
  409.  add.l YADD,d1
  410.  add.l ZADD,d2
  411.  
  412.  move.l d0,d3
  413.  cmp.l #40*65536,d3
  414.  blt.s .oksm
  415.  sub.l #40*65536,d3
  416. .oksm:
  417.  move.l d1,d4
  418.  move.l d2,d5
  419.  
  420.  swap d3
  421.  swap d4
  422.  swap d5
  423.  
  424.  muls #40,d5
  425.  add.w d5,d4
  426.  muls #40,d4
  427.  ext.l d3
  428.  add.l d4,d3
  429.  
  430.  move.w d6,d4
  431.  move.w d7,d5
  432.  asl.w #4,d5
  433.  add.w d4,d5
  434.  
  435.  move.l d7,-(a7)
  436.  lea (a1,d3.l),a5
  437.  
  438.  moveq #0,d3
  439.  moveq #0,d4
  440.  move.b (a5),d3        ;x,y,z
  441.  move.b 1(a5),d4    ;x+1,y,z
  442.  sub.w d3,d4
  443.  bge.s .okp1
  444.  neg.w d4
  445.  mulu d0,d4
  446.  neg.l d4
  447.  bra.s .dn1
  448. .okp1
  449.  mulu d0,d4
  450. .dn1
  451.  swap d4
  452.  add.w d4,d3
  453.  
  454.  moveq #0,d4
  455.  moveq #0,d5
  456.  move.b 40(a5),d4    ;x,y+1,z
  457.  move.b 41(a5),d5    ;x+1,y+1,z
  458.  sub.w d4,d5
  459.  bge.s .okp2
  460.  neg.w d5
  461.  mulu d0,d5
  462.  neg.l d5
  463.  bra.s .dn2
  464. .okp2
  465.  mulu d0,d5
  466. .dn2
  467.  swap d5
  468.  add.w d5,d4
  469.  
  470.  sub.w d3,d4
  471.  bge.s .okp5
  472.  neg.w d4
  473.  mulu d1,d4
  474.  neg.l d4
  475.  bra.s .dn5
  476. .okp5
  477.  mulu d1,d4
  478. .dn5
  479.  swap d4
  480.  add.w d4,d3
  481.  
  482.  moveq #0,d4
  483.  moveq #0,d5
  484.  move.b 1600(a5),d4        ;x,y,z
  485.  move.b 1601(a5),d5    ;x+1,y,z
  486.  sub.w d4,d5
  487.  bge.s .okp3
  488.  neg.w d5
  489.  mulu d0,d5
  490.  neg.l d5
  491.  bra.s .dn3
  492. .okp3
  493.  mulu d0,d5
  494. .dn3
  495.  swap d5
  496.  add.w d5,d4
  497.  
  498.  moveq #0,d5
  499.  moveq #0,d7
  500.  move.b 1640(a5),d5    ;x,y+1,z
  501.  move.b 1641(a5),d7    ;x+1,y+1,z
  502.  sub.w d5,d7
  503.  bge.s .okp4
  504.  neg.w d7
  505.  mulu d0,d7
  506.  neg.l d7
  507.  bra.s .dn4
  508. .okp4
  509.  mulu d0,d7
  510. .dn4
  511.  swap d7
  512.  add.w d7,d5
  513.  
  514.  sub.w d4,d5
  515.  bge.s .okp6
  516.  neg.w d5
  517.  mulu d1,d5
  518.  neg.l d5
  519.  bra.s .dn6
  520. .okp6
  521.  mulu d1,d5
  522. .dn6
  523.  swap d5
  524.  add.w d5,d4
  525.  
  526.  sub.w d3,d4
  527.  bge.s .okp7
  528.  neg.w d4
  529.  mulu d2,d4
  530.  neg.l d4
  531.  bra.s .dn7
  532. .okp7
  533.  mulu d2,d4
  534. .dn7
  535.  swap d4
  536.  add.w d4,d3
  537.  
  538.  move.l (a7)+,d7
  539.  move.w d6,d4
  540.  move.w d7,d5
  541.  asl.w #4,d5
  542.  add.w d4,d5
  543.  
  544.  lsr.b #2,d3
  545.  move.b d3,(a0,d5.w)
  546.  
  547.  
  548.  addq #1,d6
  549.  cmp.w #8,d6
  550.  ble DOWN
  551.  addq #1,d7
  552.  cmp.w #8,d7
  553.  ble ACROSS
  554.  
  555.  move.l #LIGHTMAP,a0
  556.  move.l #SMOOTHLIGHTMAP,a1
  557.  move.w #7,d0
  558. DOWNSQUARES:
  559.  swap d0
  560.  move.w #7,d0
  561.  move.l a0,a2
  562. ACROSSSQUARES:
  563.  moveq #0,d4
  564.  move.b 16(a0),d4    ;bl
  565.  moveq #0,d2
  566.  move.b (a0)+,d2    ;tl
  567.  moveq #0,d3
  568.  move.b (a0),d3        ;tr
  569.  moveq #0,d5
  570.  move.b 16(a0),d5    ;br
  571.  sub.w d2,d3
  572.  sub.w d4,d5
  573.  swap d2
  574.  swap d3
  575.  swap d4
  576.  swap d5
  577.  
  578.  asr.l #3,d3
  579.  asr.l #3,d5
  580.  moveq #7,d7
  581. ACROSSSQUARE
  582.  move.l d2,d1
  583.  move.l d4,d6
  584.  sub.l d1,d6
  585.  asr.l #3,d6
  586.  
  587.  swap d1
  588.  move.b d1,(a1)+
  589.  swap d1
  590.  add.l d6,d1
  591.  swap d1
  592.  move.b d1,64-1(a1)
  593.  swap d1
  594.  add.l d6,d1
  595.  swap d1
  596.  move.b d1,64*2-1(a1)
  597.  swap d1
  598.  add.l d6,d1
  599.  swap d1
  600.  move.b d1,64*3-1(a1)
  601.  swap d1
  602.  add.l d6,d1
  603.  swap d1
  604.  move.b d1,64*4-1(a1)
  605.  swap d1
  606.  add.l d6,d1
  607.  swap d1
  608.  move.b d1,64*5-1(a1)
  609.  swap d1
  610.  add.l d6,d1
  611.  swap d1
  612.  move.b d1,64*6-1(a1)
  613.  swap d1
  614.  add.l d6,d1
  615.  swap d1
  616.  move.b d1,64*7-1(a1)
  617.  
  618.  add.l d3,d2
  619.  add.l d5,d4
  620.  dbra d7,ACROSSSQUARE
  621.  
  622.  dbra d0,ACROSSSQUARES
  623.  add.w #16,a0
  624.  add.w #64*7,a1
  625.  swap d0
  626.  dbra d0,DOWNSQUARES
  627. *****************************
  628.  
  629.  
  630.  move.l #LEFTRIGHT,a0
  631.  move.w #15,d0
  632. emptyright:
  633.  move.l #-1,(a0)+
  634.  move.l #-1,(a0)+
  635.  move.l #-1,(a0)+
  636.  move.l #-1,(a0)+
  637.  move.l #-1,(a0)+
  638.  move.l #-1,(a0)+
  639.  move.l #-1,(a0)+
  640.  move.l #-1,(a0)+
  641.  move.l #-1,(a0)+
  642.  move.l #-1,(a0)+
  643.  move.l #-1,(a0)+
  644.  move.l #-1,(a0)+
  645.  move.l #-1,(a0)+
  646.  move.l #-1,(a0)+
  647.  move.l #-1,(a0)+
  648.  move.l #-1,(a0)+
  649.  dbra d0,emptyright
  650.  
  651.  move.w #0,d0
  652.  move.w #1,d1
  653.  bsr CALCLINE
  654.  move.w #1,d0
  655.  move.w #2,d1
  656.  bsr CALCLINE
  657.  move.w #2,d0
  658.  move.w #3,d1
  659.  bsr CALCLINE
  660.  move.w #3,d0
  661.  move.w #0,d1
  662.  bsr CALCLINE
  663.  
  664.  move.l #LEFTRIGHT,a0
  665.  move.l FASTBUFFER,a1
  666.  move.l #LEFTUVS,a3
  667.  move.l #TEXTURES,a5
  668.  move.w TEXTUREADD,d0
  669.  move.l #TWEEN,a6
  670.  bge.s .okad
  671.  add.l #65536,a5
  672.  and.w #$7fff,d0
  673. .okad:
  674.  add.w d0,a5
  675.  move.w #255,d7
  676. drawpoly:
  677.  move.w (a0)+,d0    ;left end*4
  678.  move.w (a0)+,d1    ; right end*4
  679.  blt nolineh
  680.  asr.w #2,d0
  681.  blt nolineh
  682.  asr.w #2,d1
  683.  sub.w d0,d1
  684.  blt nolineh
  685.  
  686.  move.l (a3),d2
  687.  move.l 4(a3),d3
  688.  move.l (RIGHTUVS-LEFTUVS)(a3),d4
  689.  move.l 4+(RIGHTUVS-LEFTUVS)(a3),d5
  690.  
  691.  sub.l d2,d4
  692.  sub.l d3,d5
  693.  addq #1,d1
  694.  ext.l d1
  695.  divs.l d1,d4
  696.  divs.l d1,d5
  697.  move.l d4,a4
  698.  movem.l d7/a1/a3,-(a7)
  699.  move.l d5,a3
  700.  subq #1,d1
  701.  moveq #0,d4
  702.  
  703.  lea (a1,d0.w),a1
  704.  
  705.  move.l #LIGHTMAP,a2
  706.  
  707.  move.l d2,d5
  708.  swap d5
  709.  and.b #%11111000,d5
  710.  add.w d5,d5
  711.  move.l d3,d6
  712.  swap d6
  713.  asr.w #3,d6
  714.  add.w d6,d5
  715.  
  716.  move.w 16(a2,d5.w),d6
  717.  swap d6
  718.  move.w (a2,d5.w),d6
  719.  
  720. ; move.l (a2,d5.w*2),d6
  721. ; move.l 32(a2,d5.w*2),d7
  722. ; sub.w d6,d7
  723. ; swap d6
  724. ; swap d7
  725. ; sub.w d6,d7
  726.  
  727. DOING:
  728.  
  729. .putline:
  730.  swap d1
  731.  
  732.  move.l d2,d0
  733.  swap d0
  734.  and.b #%11111000,d0
  735.  add.w d0,d0
  736.  move.l d3,d4
  737.  swap d4
  738.  asr.w #3,d4
  739.  add.w d4,d0
  740.  
  741.  cmp.w d0,d5
  742.  beq.s .noread
  743.  move.w d0,d5
  744.  move.w 16(a2,d5.w),d6    ;tr,br
  745.  swap d6
  746.  move.w (a2,d5.w),d6    ;tl,bl
  747.  
  748. ; move.l (a2,d5.w*2),d6
  749. ; move.l 32(a2,d5.w*2),d7
  750. ; sub.w d6,d7
  751. ; swap d6
  752. ; swap d7
  753. ; sub.w d6,d7
  754. .noread:
  755.  
  756.  move.l d3,d0
  757.  swap d0
  758.  asl.l #5,d0
  759.  and.w #%11100000,d0
  760.  move.w d0,d7
  761.  add.w d6,d0
  762.  move.w (a6,d0.w*2),d4
  763.  swap d6
  764.  add.w d6,d7
  765.  swap d6
  766.  move.b (a6,d7.w*2),d4
  767.  
  768.  move.l d2,d0
  769.  swap d0
  770.  asl.l #5,d0
  771.  and.w #%11100000,d0
  772.  add.w d0,d4
  773.  move.w (a6,d4.w*2),d4
  774.  
  775. ; move.w d0,d4
  776. ; muls d7,d0
  777. ; asr.w #3,d0
  778. ; add.w d6,d0    ; top bright
  779. ; swap d7
  780. ; swap d6
  781. ; muls d7,d4
  782. ; asr.w #3,d4
  783. ; add.w d6,d4    ; bot bright
  784. ; swap d7
  785. ; swap d6
  786. ;
  787. ; sub.w d0,d4    ;bot-top
  788. ; move.w d4,d1
  789. ;
  790. ; move.l d3,d4
  791. ; swap d4
  792. ; and.b #%111,d4
  793. ; muls d1,d4
  794. ; asr.w #3,d4
  795. ; add.w d0,d4
  796. ; lsl.w #8,d4
  797.  
  798.  move.l d2,d0
  799.  swap d3
  800.  move.w d3,d0
  801.  lsl.w #8,d0
  802.  lsr.l #8,d0
  803.  swap d3
  804.  move.b (a5,d0.w*4),d4
  805.  move.b TEXTUREPAL(pc,d4.w),(a1)+
  806.  add.l a4,d2
  807.  add.l a3,d3
  808.  swap d1
  809.  dbra d1,.putline
  810.  
  811.  movem.l (a7)+,d7/a1/a3
  812. nolineh
  813.  add.w #320,a1
  814.  add.w #16,a3
  815.  dbra d7,drawpoly
  816.  bra PASTIT
  817.  
  818. TEXTUREPAL: incbin "ab3:includes/newtexturemaps.pal"
  819.  
  820. PASTIT:
  821. NOPOLYGON:
  822.  move.l (a7)+,a0
  823.  move.l (a7)+,d7
  824.  dbra d7,POLYGONLOOP
  825.  
  826.  
  827.  move.l FASTBUFFER,a0
  828.  add.l #40*320,a0
  829.  move.l #RAWSCRN+40*40,a1
  830.  move.l #(320/8)-1,d0
  831.  move.l #175,d1
  832.  move.w #0,d2
  833.  move.w #0,d3
  834.  moveq #0,d4
  835.  moveq #0,d5
  836. donebigconv
  837.  jsr CHUNKYTOPLANAR 
  838.  
  839.  move.l FASTBUFFER,a0
  840.  add.l #40*320,a0
  841.  
  842.  move.w #((320*176)/64)-1,d0
  843.  moveq #0,d1
  844. clrchunk:
  845.  move.l d1,(a0)+
  846.  move.l d1,(a0)+
  847.  move.l d1,(a0)+
  848.  move.l d1,(a0)+
  849.  move.l d1,(a0)+
  850.  move.l d1,(a0)+
  851.  move.l d1,(a0)+
  852.  move.l d1,(a0)+
  853.  move.l d1,(a0)+
  854.  move.l d1,(a0)+
  855.  move.l d1,(a0)+
  856.  move.l d1,(a0)+
  857.  move.l d1,(a0)+
  858.  move.l d1,(a0)+
  859.  move.l d1,(a0)+
  860.  move.l d1,(a0)+
  861.  dbra d0,clrchunk
  862.  
  863.  
  864.     btst #7,$bfe001
  865.     beq.s exit_closescr
  866.  
  867.  
  868.     add.l #$2000,lmxoff
  869.     cmp.l #40*65536,lmxoff
  870.     blt.s .oksm
  871.     sub.l #40*65536,lmxoff    
  872. .oksm
  873.  
  874.     bra loop
  875.     
  876. lmxoff: dc.l 0
  877.  
  878. exit_closescr
  879.     move.l    MyScreen(pc),a0
  880.     CALLINT CloseScreen
  881.  
  882. exit_closeall
  883.     move.l    _GfxBase(pc),a1
  884.     CALLEXEC CloseLibrary
  885.  
  886. exit_closeint
  887.     move.l    _IntuitionBase(pc),a1
  888.     CALLEXEC CloseLibrary
  889.  
  890. exit_false
  891.     move.l    #0,d0                return code
  892.     rts
  893.     
  894. XCOS: dc.w 0
  895. YCOS: dc.w 0
  896. XSIN: dc.w 0
  897. YSIN: dc.w 0
  898. XADD: dc.l 0
  899. YADD: dc.l 0
  900. ZADD: dc.l 0
  901. XOFF: dc.w 0
  902. YOFF: dc.w 0
  903. OLDXM: dc.w 0
  904. OLDYM: dc.w 0
  905.  
  906. TEXTUREADD: dc.w 0
  907.  
  908. CALCLINE:
  909.  
  910.  moveq #0,d2
  911.  moveq #0,d3
  912.  moveq #0,d4
  913.  moveq #0,d5
  914.  move.l #UVCOORDS,a0
  915.  move.w (a0,d0.w*4),d2
  916.  swap d2
  917.  move.w 2(a0,d0.w*4),d3
  918.  swap d3
  919.  move.w (a0,d1.w*4),d4
  920.  swap d4
  921.  move.w 2(a0,d1.w*4),d5
  922.  swap d5
  923.  
  924.  move.l #ONSCREENPTS,a1
  925.  move.w 2(a1,d0.w*4),d6    ; ly
  926.  move.w 2(a1,d1.w*4),d7    ; ry
  927.  
  928.  asr.w #2,d6
  929.  move.l #LEFTRIGHT+2,a2
  930.  move.l #RIGHTUVS,a3
  931.  asr.w #2,d7
  932.  cmp.w d6,d7
  933.  beq .noline
  934.  bgt.s .lineonright
  935. .lineonleft:
  936.  move.l #LEFTUVS,a3
  937.  subq #2,a2
  938.  exg d6,d7
  939.  exg d0,d1
  940.  exg d2,d4
  941.  exg d3,d5 
  942.  
  943. ***********
  944. * THROW AWAY ABOVE FOR NOW.
  945. ***********
  946. .lineonright:
  947.  sub.w d6,d7
  948.  lea (a2,d6.w*4),a2
  949.  
  950.  movem.l d0-d7/a0-a6,-(a7)
  951.  move.l #SUBSTACK,a0
  952.  asl.w #2,d0
  953.  asl.w #2,d1
  954.  move.l #ROTATEDPTS,a1
  955.  move.l a0,a2
  956.  move.l 4(a1,d0.w*4),(a2)+    ;ty
  957.  move.l 8(a1,d0.w*4),(a2)+    ;tz
  958.  move.l 4(a1,d1.w*4),(a2)+    ;by
  959.  move.l 8(a1,d1.w*4),(a2)+    ;bz
  960.  move.l d2,(a2)+        ;tu
  961.  move.l d3,(a2)+        ;tv
  962.  move.l d4,(a2)+        ;bu
  963.  move.l d5,(a2)+        ;bv
  964.  move.l (a1,d0.w*4),(a2)+    ;tx
  965.  move.l (a1,d1.w*4),(a2)+    ;bx
  966.  move.l #0,a5
  967.  bsr SUBDIVIDE
  968.  move.l a5,MAXSUB
  969.  
  970.  movem.l (a7)+,d0-d7/a0-a6
  971.  
  972.  move.w (a1,d0.w*4),d2
  973.  move.w 2(a1,d0.w*4),d3
  974.  move.w (a1,d1.w*4),d4
  975.  move.w 2(a1,d1.w*4),d5
  976.  
  977.  sub.w d2,d4    ;dx
  978.  sub.w d3,d5    ;dy
  979.          ;d7=ddy
  980.  
  981.  subq #1,d7
  982.  swap d4
  983.  clr.w d4
  984.  swap d2
  985.  clr.w d2
  986.  asl.l #2,d4
  987.  ext.l d5
  988.  divs.l d5,d4    ;dx/dy
  989. .putinleftline
  990.  swap d2
  991.  move.w d2,(a2)
  992.  addq #4,a2
  993.  swap d2
  994.  add.l d4,d2
  995.  dbra d7,.putinleftline
  996.  
  997. .noline:
  998.  rts
  999.  
  1000. MAXSUB: dc.l 0
  1001.  
  1002. SUBDIVIDE:
  1003.  add.l #1,a5
  1004.  move.l (a0),d0
  1005.  move.l d0,d4
  1006.  move.l 4(a0),d1
  1007.  divs d1,d0
  1008.  move.l 8(a0),d2
  1009.  add.l d2,d4
  1010.  and.b #%11111100,d0
  1011.  move.l d2,40+8(a0)
  1012.  add.w #128*4,d0
  1013.  move.l 12(a0),d3
  1014.  asr.l #1,d4    ; middle y
  1015.  move.l d3,40+12(a0)
  1016.  divs d3,d2
  1017.  
  1018.  and.b #%11111100,d2
  1019.  add.w #128*4,d2
  1020.  
  1021.  move.l d1,12(a3,d0.w*4)
  1022.  move.l d3,12(a3,d2.w*4)
  1023.  add.l d1,d3
  1024.  asr.l #1,d3
  1025.  
  1026.  move.l 16(a0),d5
  1027.  move.l d5,(a3,d0.w*4)
  1028.  move.l 24(a0),d6
  1029.  move.l d6,24+40(a0)
  1030.  add.l d6,d5
  1031.  asr.l #1,d5
  1032.  move.l d5,(a3,d2.w*4)
  1033.  
  1034.  move.l 20(a0),d6
  1035.  move.l d6,4(a3,d0.w*4)
  1036.  move.l 28(a0),d7
  1037.  move.l d7,28+40(a0)
  1038.  add.l d7,d6
  1039.  asr.l #1,d6
  1040.  move.l d7,4(a3,d2.w*4)
  1041.  
  1042.  move.l 32(a0),d7
  1043.  move.l d7,8(a3,d0.w*4)
  1044.  move.l 36(a0),d1
  1045.  move.l d1,36+40(a0)
  1046.  add.l d1,d7
  1047.  asr.l #1,d7
  1048.  move.l d1,8(a3,d2.w*4)
  1049.  
  1050.  sub.w d0,d2
  1051.  sub.w #4,d2
  1052.  ble.s .nomore
  1053.  
  1054.  move.l d4,40(a0)  ;my
  1055.  move.l d4,8(a0)
  1056.  
  1057.  move.l d3,40+4(a0)    ;mz
  1058.  move.l d3,12(a0)
  1059.  move.l d5,40+16(a0)
  1060.  move.l d5,16+8(a0)
  1061.  move.l d6,40+20(a0)
  1062.  move.l d6,20+8(a0)
  1063.  move.l d7,40+32(a0)
  1064.  move.l d7,36(a0)
  1065.  
  1066.  add.l #40,a0
  1067.  bsr SUBDIVIDE
  1068.  sub.l #1,a5
  1069.  sub.l #40,a0
  1070.  bsr SUBDIVIDE
  1071.  
  1072. .nomore
  1073.  rts
  1074.  
  1075. **********************************************************
  1076.  
  1077. UVCOORDS: ds.l 4
  1078. ROTATEDPTS: ds.l 4*4
  1079. ONSCREENPTS: ds.l 4
  1080.  
  1081. ZOFF: dc.w 400
  1082.  
  1083. LEFTRIGHT: ds.l 256
  1084.  
  1085. POLYGONDATA:
  1086.  dc.w 11
  1087.  dc.w 3*256+3
  1088.  dc.w -128,-128,128,0,0
  1089.  dc.w 128,-128,128,63,0
  1090.  dc.w 128,128,128,63,63
  1091.  dc.w -128,128,128,0,63
  1092.  
  1093.  dc.w 3*256+2
  1094.  dc.w 128,-128,128,0,0
  1095.  dc.w 128,-128,-128,63,0
  1096.  dc.w 128,128,-128,63,63
  1097.  dc.w 128,128,128,0,63
  1098.  
  1099.  dc.w 2*256+1
  1100.  dc.w -128,-128,-128,0,0
  1101.  dc.w -128,-128,128,63,0
  1102.  dc.w -128,128,128,63,63
  1103.  dc.w -128,128,-128,0,63
  1104.  
  1105.  
  1106.  dc.w 2*256+0
  1107.  dc.w 128,-128,-128,0,0
  1108.  dc.w -128,-128,-128,63,0
  1109.  dc.w -128,128,-128,63,63
  1110.  dc.w 128,128,-128,0,63
  1111.  
  1112.  
  1113.  dc.w $8000+3
  1114.  dc.w -128,-128,-128,0,0
  1115.  dc.w 128,-128,-128,63,0
  1116.  dc.w 128,-128,128,63,63
  1117.  dc.w -128,-128,128,0,63
  1118.  
  1119.  
  1120.  dc.w $8000+1*256
  1121.  dc.w -128,128,128,0,0
  1122.  dc.w 128,128,128,63,0
  1123.  dc.w 128,128,-128,63,63
  1124.  dc.w -128,128,-128,0,63
  1125.  
  1126.  
  1127. *****
  1128.  
  1129.  
  1130.  dc.w 3*256+3
  1131.  dc.w -38-40,-38,-38,0,0
  1132.  dc.w 38+40,-38,-38,63,0
  1133.  dc.w 38+40,38,-38,63,63
  1134.  dc.w -38-40,38,-38,0,63
  1135.  
  1136.  dc.w 3*256+2
  1137.  dc.w -38-40,-38,38,0,0
  1138.  dc.w -38-40,-38,-38,63,0
  1139.  dc.w -38-40,38,-38,63,63
  1140.  dc.w -38-40,38,38,0,63
  1141.  
  1142.  dc.w 2*256+1
  1143.  dc.w 38+40,-38,-38,0,0
  1144.  dc.w 38+40,-38,38,63,0
  1145.  dc.w 38+40,38,38,63,63
  1146.  dc.w 38+40,38,-38,0,63
  1147.  
  1148.  
  1149.  dc.w 2*256+0
  1150.  dc.w 38+40,-38,38,0,0
  1151.  dc.w -38-40,-38,38,63,0
  1152.  dc.w -38-40,38,38,63,63
  1153.  dc.w 38+40,38,38,0,63
  1154.  
  1155.  
  1156.  dc.w $8000+3
  1157.  dc.w -38-40,38,-38,0,0
  1158.  dc.w 38+40,38,-38,63,0
  1159.  dc.w 38+40,38,38,63,63
  1160.  dc.w -38-40,38,38,0,63
  1161.  
  1162.  
  1163.  dc.w $8000+1*256
  1164.  dc.w -38-40,-38,38,0,0
  1165.  dc.w 38+40,-38,38,63,0
  1166.  dc.w 38+40,-38,-38,63,63
  1167.  dc.w -38-40,-38,-38,0,63
  1168.  
  1169. SINETABLE:
  1170.  incbin "ab3:includes/bigsine"
  1171.  
  1172. YANG: dc.w 0
  1173. XANG: dc.w 0
  1174.  
  1175. **********************************************************
  1176.  
  1177. * the definition of the screen - note that in assembler you
  1178. * MUST get the sizes of these fields correct, by consulting either
  1179. * the RKM or the header files
  1180.  
  1181.  
  1182. MyNewScreen    dc.w    0,0        left, top
  1183.         dc.w    320,256        width, height
  1184.         dc.w    8        depth
  1185.         dc.b    0,1        pens
  1186.         dc.w    0        viewmodes
  1187.         dc.w    CUSTOMSCREEN    type
  1188.         dc.l    MyFont        font
  1189.         dc.l    screen_title    title
  1190.         dc.l    0        gadgets
  1191.         dc.l    0        bitmap
  1192.  
  1193. * my font definition
  1194. MyFont    dc.l    font_name
  1195.     dc.w    TOPAZ_SIXTY
  1196.     dc.b    FS_NORMAL
  1197.     dc.b    FPF_ROMFONT
  1198.  
  1199. * the variables
  1200. _IntuitionBase    dc.l    0        Intuition lib pointer
  1201. _GfxBase    dc.l    0        graphics lib pointer
  1202. MyScreen        dc.l    0
  1203. MyWindow        dc.l    0
  1204. MyNewWindow    ds.b    nw_SIZE        a buffer
  1205.  
  1206.  
  1207. * some strings
  1208. int_name    INTNAME
  1209. graf_name    GRAFNAME
  1210. hello_message    dc.b    'Hello World'
  1211.  
  1212. * these are C strings, so have to be null terminated
  1213. screen_title    dc.b    'My Own Screen',0
  1214. font_name    dc.b    'topaz.font',0
  1215. window_title    dc.b    'A Simple Window',0
  1216.  
  1217.  even
  1218.  
  1219. xmouse: dc.w 0
  1220. ymouse: dc.w 0
  1221.  
  1222. spleen: dc.w 0
  1223. lastspleen: dc.w 0
  1224.  
  1225. COPIEDPAL:
  1226.  dc.w 256,0
  1227.  ds.l 3*256
  1228.  ds.l 10
  1229.  
  1230. PALETTEBIT:
  1231. ; incbin "256palette"
  1232. ; dc.w $ffff,$fffe
  1233.  
  1234.  incbin "ab3:includes/256pal"
  1235.  
  1236.  include "ab3:source_4000/chunky.s"
  1237.  
  1238. willy: ds.w 49
  1239.  
  1240.  
  1241. PALS:
  1242.  ds.l 2*49
  1243.  
  1244.  
  1245. FRAME: dc.w 4
  1246. FLIBBLE: dc.w 0
  1247.  
  1248. LIGHTMAP:
  1249.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1250.  dc.w 0,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0
  1251.  dc.w 0,31,31,31,0,0,0,0,0,0,0,0,0,0,0,0
  1252.  dc.w 0,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0
  1253.  dc.w 0,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0
  1254.  dc.w 0,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0
  1255.  dc.w 0,31,31,31,0,0,0,0,0,0,0,0,0,0,0,0
  1256.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1257.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1258.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1259.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1260.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1261.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1262.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1263.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1264.  dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1265.  
  1266. SMOOTHLIGHTMAP:
  1267.  ds.b 64*64
  1268.  
  1269. FASTBUFFER:
  1270.  dc.l fasty
  1271.  
  1272. fasty: ds.b 320*256
  1273.  
  1274. SUBSTACK: ds.l 10*100
  1275.  
  1276. LEFTUVS: ds.l 4*256
  1277. RIGHTUVS: ds.l 4*256
  1278.  
  1279. WORLD: incbin "ab3:includes/world"
  1280.  
  1281. TWEEN: incbin "ab3:includes/tweenbrightfile"
  1282.  
  1283. TEXTURES: incbin "ab3:includes/newtexturemaps"
  1284.  
  1285.  SECTION BGDROP,code_c
  1286.  
  1287. RAWSCRN:
  1288.  ds.l 2560*8
  1289.